package com.example.demo.threadDemo.athreadedCommunication;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Description DeskDemo
 * @Author songchuanlong
 * @Date 2025-04-16
 */
public class DeskDemo2 {
    //String代表包子，，，list代表盘
    private List<String> list=new ArrayList<>();
    private final Lock lk = new ReentrantLock();
    private final Condition producerCondition = lk.newCondition();
    private final Condition consumerCondition = lk.newCondition();
    //每次放一个包子
    //厨师1、厨师2、厨师3
    //厨师和消费者都是在桌子上拿，所以锁的对象是把DeskDemo作为this锁起来
    public void put() {
            String name = Thread.currentThread().getName();
        try {
            lk.lock();
            while (list.size() != 0) {
                // 盘子不为空，等待
                producerCondition.await();
            }

            // 可以生产一个包子
            list.add(name + "做了一个包子");
            System.out.println(name + "已经做好了一个包子");
            Thread.sleep(2000);

            // ✅ 生产完成，唤醒所有等待中的线程（包括消费者和其他生产者）
            consumerCondition.signal();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            lk.unlock();
        }
    }
    //每次取一个包子
    //消费者1、消费者2
    public void get() {
            String name = Thread.currentThread().getName();
        try {
            lk.lock();
            while (list.isEmpty()) {
                // 盘子为空，等待
                consumerCondition.await();
            }

            // 消费包子
            System.out.println(name + "吃了" + list.get(0));
            list.clear();
            Thread.sleep(2000);

            // ✅ 消费完成，唤醒所有等待中的线程（主要是生产者）
            producerCondition.signal();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            lk.unlock();
        }
    }
}
